#ifndef _Auxiliares_H
#define _Auxiliares_H

#include "Matriz.h"
#include <vector>
#include <fstream>

using namespace std;

struct tPosicion{
    double x;
    double y;
    int i;
};

struct tRecta{
	double a;
	double b;
};

struct tParabola{
	//ax^2 + bx +c
	double a;
	double b;
	double c;
};

vector<tPosicion> Transformar1(const vector<tPosicion> &muestras){
    unsigned int i;
    vector<tPosicion> ret;
    tPosicion temp;

    for (i=0; i<muestras.size();i++){
        temp.x = muestras[i].i;
        temp.y = muestras[i].x;
		temp.i = muestras[i].i;
        ret.push_back(temp);
    }

    return ret;
}

vector<tPosicion> Transformar2(const vector<tPosicion> &muestras){
    unsigned int i;
    vector<tPosicion> ret;
    tPosicion temp;

    for (i=0; i<muestras.size();i++){
        temp.x = muestras[i].i;
        temp.y = muestras[i].y;
		temp.i = muestras[i].i;
        ret.push_back(temp);
    }

    return ret;
}

tRecta rectaCuadradosMinimos(const vector<tPosicion> &muestras, int n){

	//pendiente y ordenada al origen
	int i;	
	double H,I,J,K,L;

	//n = (double)muestras.size();	

	//En H guardo la sumatoria de xi^2
	//En I guardo la sumatoria de xi
	//En J guardo la sumatoria de xi.yi
	//En L guardo la sumatoria de yi
	H=0; I=0; J=0; L=0;
	for (i=muestras.size()-n; i<muestras.size(); i++){
		H = H + (muestras[i].x*muestras[i].x);
		I = I + muestras[i].x;
		J = J + (muestras[i].x*muestras[i].y);
		L = L + muestras[i].y;
	}

	//K es igual a I
	K = I;

	Matriz* m = new Matriz(2,2);
	Matriz* b = new Matriz(2,1);

	m->setValor(1,1,K);
	m->setValor(1,2,n);
	m->setValor(2,1,H);
	m->setValor(2,2,I);

	b->setValor(1,1,L);
	b->setValor(2,1,J);

	Matriz* x = m->resolverSistema(b);

	tRecta r1;
	r1.a = x->getValor(1,1);
	r1.b = x->getValor(2,1);

	delete(m);
	delete(b);
	delete(x);

	return r1;
}

//Me da una parabola que pasa por los 2 puntos que le paso por parametro y ademas pasa por 0,0
tParabola parabola(tPosicion p1, tPosicion p2){
	Matriz* m = new Matriz(2,2);
	Matriz* b = new Matriz(2,1);
	
	m->setValor(1,1,p1.x*p1.x);
	m->setValor(1,2,p1.x);
	m->setValor(2,1,p2.x*p2.x);
	m->setValor(2,2,p2.x);

	b->setValor(1,1,p1.y);
	b->setValor(2,1,p2.y);

	Matriz* x = m->resolverSistema(b);

	tParabola res;
	res.a = x->getValor(1,1);
	res.b = x->getValor(2,1);
	res.c = 0;

	return res;	
}

bool esCorner(const vector<tPosicion> &muestras){
	int n = muestras.size();
	return (muestras[n-1].y > muestras[n-2].y);
}

#endif